package com.weiyi.portal.modules.pms.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.weiyi.portal.dto.PmsProductDTO;
import com.weiyi.portal.modules.pms.model.PmsProduct;
import com.weiyi.portal.modules.pms.mapper.PmsProductMapper;
import com.weiyi.portal.modules.pms.service.PmsProductAttributeValueService;
import com.weiyi.portal.modules.pms.service.PmsProductService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.weiyi.portal.modules.sms.service.SmsAdvertiseNewsRelationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.lang.reflect.Method;
import java.util.List;

/**
 * <p>
 * 商品信息 服务实现类
 * </p>
 *
 * @author PZC
 * @since 2022-10-13
 */
@Service
public class PmsProductServiceImpl extends ServiceImpl<PmsProductMapper, PmsProduct> implements PmsProductService {
    @Autowired
    PmsProductAttributeValueService pmsProductAttributeValueService;

    @Override
    public Boolean create(PmsProductDTO pmsProductDTO) {
        PmsProduct product = pmsProductDTO;
        product.setId(null);
        boolean flag = this.save(product);
        if(flag){
            SaveManyList(pmsProductDTO.getProductAttributeValueList(), product.getId(), pmsProductAttributeValueService);
        }
        return flag;
    }


    /**
     *  公共方法： 保存会员价格、阶梯价格、减满价格、 sku 、 spu 商品的关联数据
     *
     *  统一： 都需要设置商品id,  都需要批量保存
     */
    public void SaveManyList(List list, Long productId, IService service){
        // 如果数据为空 或者长度为0  不做任何操作
        if(CollectionUtil.isEmpty(list)) return;

        try {
            // 循环 反射 赋值商品id
            for (Object obj : list) {
                Method setProductIdMethod = obj.getClass().getMethod("setProductId", Long.class);

                // 在修改状态清除主键id
                Method setId = obj.getClass().getMethod("setId", Long.class);
                setId.invoke(obj,(Long)null);

                // 调用setProductId
                setProductIdMethod.invoke(obj, productId);
            }

            service.saveBatch(list);
        }
        catch (Exception ex){
            throw new RuntimeException(ex);
        }
    }
}
